package com.xuecheng.media.controller;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.vod.model.v20170321.CreateUploadVideoResponse;
import com.aliyuncs.vod.model.v20170321.RefreshUploadVideoResponse;
import com.xuecheng.api.media.AliyunVodApi;
import com.xuecheng.api.media.model.aliyun.VodUploadRequest;
import com.xuecheng.api.media.model.aliyun.VodUploadToken;
import com.xuecheng.api.media.model.dto.MediaDTO;
import com.xuecheng.api.media.model.vo.MediaVO;
import com.xuecheng.common.domain.code.CommonErrorCode;
import com.xuecheng.common.exception.ExceptionCast;
import com.xuecheng.common.util.SecurityUtil;

import com.xuecheng.media.common.constant.MediaErrorCode;
import com.xuecheng.media.common.utils.AliyunVODUtil;
import com.xuecheng.media.convert.MediaConvert;
import com.xuecheng.media.service.MediaService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.web.bind.annotation.*;
/**
 * <p></p>
 *
 * @Description:
 */
@Slf4j
@RestController
public class AliyunVodController implements AliyunVodApi {

    @Autowired
    private MediaService mediaService;
    /*
    * aliyun.region = cn-shanghai
    aliyun.accessKeyId = LTAI4G3wMNtzQPfFPDMHoCJF
    aliyun.accessKeySecret = uxzY3N4czSqZqhcXcuOq0ZcRlB6zjB
    *
    * */
    @Value("${aliyun.region}")
    private  String region;
    @Value("${aliyun.accessKeyId}")
    private  String accessKeyId;
    @Value("${aliyun.accessKeySecret}")
    private  String accessKeySecret;
    @PostMapping("media/vod-token")
    public VodUploadToken generateUploadToken(@RequestBody VodUploadRequest uploadRequest) {
        // PS: 只要和本项目中微服务之外的内容要产生交互，必须要进行try-catch处理
        //   交互方：aliyun（第三方服务）
        //   原因：网络（不稳定因素）
        try {
            // 1.初始化客户端
            DefaultAcsClient client = AliyunVODUtil.initVodClient(region, accessKeyId, accessKeySecret);
            // 2.创建请求对象并获得响应对象
            CreateUploadVideoResponse response = AliyunVODUtil.createUploadVideo(client, uploadRequest.getTitle(), uploadRequest.getFileName());
            // 3.解析响应数据
            VodUploadToken token = new VodUploadToken();
            token.setVideoId(response.getVideoId());
            token.setUploadAddress(response.getUploadAddress());
            token.setUploadAuth(response.getUploadAuth());
            token.setRequestId(response.getRequestId());
            return token;
        } catch (Exception e) {
            // printStackTrace：将程序中的所有调用关系的栈信息进行打印-日志（日志文件-IO）
            // 用户大量请求
            // e.printStackTrace();  //丢工作
            // 异常信息的说明
            // 1.只将错误信息记录
            // 2.将错误信息隐藏并返回友好提示
            String message = e.getMessage();
            log.error(MediaErrorCode.E_140011.getDesc()+" : {}",message);
            // throw new BusinessException();
            // 编译器的问题：只看代码，不管代码中方法调用的结果内容
            ExceptionCast.cast(CommonErrorCode.UNKOWN);
            return null;
        }
    }
    @GetMapping("media/refresh-vod-token/{videoId}")
    public VodUploadToken refreshUploadToken(@PathVariable String videoId) {
        // PS: 只要和本项目中微服务之外的内容要产生交互，必须要进行try-catch处理
        //   交互方：aliyun（第三方服务）
        //   原因：网络（不稳定因素）
        try {
            // 1.初始化客户端
            DefaultAcsClient client = AliyunVODUtil.initVodClient(region, accessKeyId, accessKeySecret);
            // 2.创建请求对象并获得响应对象
            RefreshUploadVideoResponse response = AliyunVODUtil.refreshUploadVideo(client, videoId);
            // 3.解析响应数据
            VodUploadToken token = new VodUploadToken();
            token.setVideoId(response.getVideoId());
            token.setUploadAddress(response.getUploadAddress());
            token.setUploadAuth(response.getUploadAuth());
            token.setRequestId(response.getRequestId());
            return token;
        } catch (Exception e) {
            // printStackTrace：将程序中的所有调用关系的栈信息进行打印-日志（日志文件-IO）
            // 用户大量请求
            // e.printStackTrace();  //丢工作
            // 异常信息的说明
            // 1.只将错误信息记录
            // 2.将错误信息隐藏并返回友好提示
            String message = e.getMessage();
            log.error(MediaErrorCode.E_140015.getDesc()+" : {}",message);
            // throw new BusinessException();
            // 编译器的问题：只看代码，不管代码中方法调用的结果内容
            ExceptionCast.cast(CommonErrorCode.UNKOWN);
            return null;
        }
    }

}